/*
描述
　　在 LIT 综教楼后有一个深坑，关于这个坑的来历，有很多种不同的说法。其中一种说法是，在很多年以前，这个坑就已经在那里了。这种说法也被大多数人认可，这是因为该坑有一种特别的结构，想要人工建造是有相当困难的。

　　从横截面图来看，坑底成阶梯状，由从左至右的 1..N 个的平面构成（其中 1 ≤ N ≤ 100,000），如图：

　　　＊　　　　　　　　　　　　＊ :
　　　＊　　　　　　　　　　　　＊ :
　　　＊　　　　　　　　　　　　＊ 8
　　　＊　　　　＊＊　　　　　　＊ 7
　　　＊　　　　＊＊　　　　　　＊ 6
　　　＊　　　　＊＊　　　　　　＊ 5
　　　＊　　　　＊＊＊＊＊＊＊＊＊ 4 <- 高度
　　　＊　　　　＊＊＊＊＊＊＊＊＊ 3
　　　＊＊＊＊＊＊＊＊＊＊＊＊＊＊ 2
　　　＊＊＊＊＊＊＊＊＊＊＊＊＊＊ 1
平面　｜　 1　 ｜2｜　　　3　　　 ｜ 
每个平面 i 可以用两个数字来描述，即它的宽度 Wi 和高度 Hi，其中 1 ≤ Wi ≤ 1,000、1 ≤ Hi ≤ 1,000,000，而这个坑最特别的地方在于坑底每个平面的高度都是不同的。每到夏天，雨水会把坑填满，而在其它的季节，则需要通过人工灌水的方式把坑填满。灌水点设在坑底位置最低的那个平面，每分钟灌水量为一个单位（即高度和宽度均为 1）。随着水位的增长，水自然会向其它平面扩散，当水将某平面覆盖且水高达到一个单位时，就认为该平面被水覆盖了。

　　请你计算每个平面被水覆盖的时间。

　　 灌水              水满后自动扩散
        |                       |                           
      * |          *      *     |      *      *            *
      * V          *      *     V      *      *            *
      *            *      *    ....    *      *~~~~~~~~~~~~*
      *    **      *      *~~~~** :    *      *~~~~**~~~~~~*
      *    **      *      *~~~~** :    *      *~~~~**~~~~~~*
      *    **      *      *~~~~**~~~~~~*      *~~~~**~~~~~~*
      *    *********      *~~~~*********      *~~~~*********
      *~~~~*********      *~~~~*********      *~~~~*********
      **************      **************      **************
      **************      **************      **************
　　　4 分钟后        　　　26 分钟后 　　　　　　　50 分钟后
　　　平面 1 被水覆盖 　　　　平面 3 被水覆盖　　　　平面 2 被水覆盖输入
　　输入的第一行是一个整数 N，表示平面的数量。从第二行开始的 N 行上分别有两个整数，分别表示平面的宽度和高度。

输出
　　输出每个平面被水覆盖的时间。
*/

/*
测试用例1：
输入：
3
4 2
2 7
6 4
输出：
4↵
50↵
26↵

测试用例2：
输入：
3
4 2
6 4
2 7
输出：
4↵
18↵
50↵
*/

#include <iostream>
#include <vector>

using namespace std;

// 平台
struct platform
{
   // 宽
   int width;
   
   // 填充时的水面宽度
   int fill_width;
   
   // 高
   int height;
   
   // 下一个填充平面度索引
// int next = -1;
   
   // 被填充的时间点
   int time = -1;
   
   // 初始化
   platform(int w, int h) : width(w), height(h) {}
   platform(){}
};

int main()
{
   // 输入平面个数
   int N;
   cin >> N;
   
   // 存储各个平台的信息
   vector<platform> platforms(N+2);
   
   // 第一个平台无限高
   platform p1(0, 9999);
   platforms[0] = p1;
   
   // 输入宽度和高度
   int width, height;
   int fill_id = 0; // 记录此时被灌水的平面
   for (int i=1; i<=N; i++)
   {
      cin >> width;
      cin >> height;
      platform p(width, height);
      platforms[i] = p;
      
      // 更新最低平面索引
      if (height < platforms[fill_id].height)
         fill_id = i;
   }
   
   // 最后一个平台无限高
   platform p2(0, 9999);
   platforms[N+1] = p2;
   
   // 记录时间
   int time = 0;
   
   // 计算各个平面被填充的时间点（不考虑首尾平台）
   for (int i=0; i<N; i++)
   {
      
      // 找到灌水平台的两侧高平面
      int left_id = fill_id;
      int right_id = fill_id;
      
      // 找左侧高平面
      while (left_id != 0)
      {
         left_id--;
         
         if (platforms[left_id].height > platforms[fill_id].height)
            break;
      }
      
      // 找右侧高平面
      while (right_id != N+1)
         {
            right_id++;
            
            if (platforms[right_id].height > platforms[fill_id].height)
               break;
         }
      
      // 计算高差
      int fill_right = platforms[right_id].height - platforms[fill_id].height;
      int fill_left = platforms[left_id].height - platforms[fill_id].height;
      
      // 判断两侧平面，哪个更高
      bool judge = platforms[right_id].height > platforms[left_id].height;
      
      // 计算灌水时的宽度
      int fill_width = 0;
      for (int id=left_id+1; id<right_id; id++)
      {
         fill_width += platforms[id].width;
      }
      platforms[fill_id].fill_width = fill_width;
      
      // 填满该平台的时间点
      time += platforms[fill_id].fill_width;
      platforms[fill_id].time = time;
      
      // 开始向另一个平台灌水的时间点
      int height_diff = judge ? fill_left : fill_right;
      time += platforms[fill_id].fill_width * (height_diff - 1);
      
      // 寻找下一个灌水地
      fill_id = judge ? left_id : right_id;
      int right = judge ? -1 : 1; // 右移标记
      
      while(platforms[fill_id].height > platforms[fill_id + right].height 
            && platforms[fill_id + right].time == -1)
         fill_id += right;
      
   }
   
   for (int i=1; i<=N; i++)
      cout << platforms[i].time << endl;
   
   
   return 0;
}
